package com.adee.algorithm.structure.s02_queue;

import org.junit.Test;

import java.util.LinkedList;
import java.util.Queue;

// 最佳实践：作为队列使用，首选LinkedList
public class Test001_queue {

    // 队列
    // 在 Java 里，队列是一种遵循先进先出（FIFO，First-In-First-Out）原则的数据结构，即最先进入队列的元素会最先被移除。它在很多场景下都有广泛应用，如任务调度、消息传递等。下面从接口、实现类、使用场景、示例代码几个方面详细介绍 Java 中的队列。
    //队列接口
    //Java 为队列提供了多个接口，其中核心的是 Queue 接口，它继承自 Collection 接口。此外，还有 Deque（双端队列）接口，它继承自 Queue 接口，支持在队列两端进行插入和删除操作。
    //Queue 接口方法

    //插入元素：
    //add(E e)：将指定元素插入队列，若队列已满则抛出 IllegalStateException 异常。
    //offer(E e)：将指定元素插入队列，若队列已满则返回 false。

    //移除元素：
    //remove()：移除并返回队列头部元素，若队列为空则抛出 NoSuchElementException 异常。
    //poll()：移除并返回队列头部元素，若队列为空则返回 null。

    //查看元素：
    //element()：返回队列头部元素，但不移除，若队列为空则抛出 NoSuchElementException 异常。
    //peek()：返回队列头部元素，但不移除，若队列为空则返回 null。

    //Deque 接口方法：除了具备 Queue 接口的方法，还提供了在队列两端操作的方法，如 addFirst(E e)、addLast(E e)、removeFirst()、removeLast() 等。

    //常见实现类
    //1. LinkedList
    //特点：基于双向链表实现，既实现了 List 接口，也实现了 Deque 接口，因此可以当作普通队列、双端队列使用。插入和删除操作效率高，但随机访问效率低。
    //适用场景：适用于需要频繁在队列两端进行插入和删除操作的场景。
    //2. ArrayDeque
    //特点：基于数组实现的双端队列，不允许存储 null 元素。在性能上通常优于 LinkedList，尤其是在频繁的插入和删除操作时。
    //适用场景：适用于对性能要求较高的双端队列操作场景。
    //3. PriorityQueue
    //特点：优先队列，不遵循 FIFO 原则，而是根据元素的优先级进行排序。元素需要实现 Comparable 接口或者在创建队列时提供 Comparator 来定义优先级。
    //适用场景：适用于需要根据元素优先级进行处理的场景，如任务调度系统中优先处理高优先级任务。
    //4. 阻塞队列（BlockingQueue 及其实现类）
    //特点：BlockingQueue 是一个阻塞接口，继承自 Queue 接口，主要用于多线程环境。当队列已满时，插入操作会阻塞；当队列为空时，移除操作会阻塞。常见实现类有：
    //ArrayBlockingQueue：基于数组实现的有界阻塞队列。
    //LinkedBlockingQueue：基于链表实现的有界或无界阻塞队列。
    //SynchronousQueue：一个不存储元素的阻塞队列，每个插入操作必须等待另一个线程的移除操作，反之亦然。
    //适用场景：适用于生产者 - 消费者模型，协调生产者和消费者线程的速度。
    @Test
    public void test01() {
        Queue<Integer> q = new LinkedList<>();
        q.offer(1);  // 入队
        q.offer(2);  // 入队
        q.offer(3);  // 入队
        System.out.println(q.poll());  // 出队
        System.out.println(q.peek());  // 获取队首元素
        System.out.println(q.poll());  // 出队
        System.out.println(q.poll());  // 出队


    }

}
